#include<bits/stdc++.h>
using namespace std;
const int NN=1e5+4;
// int up[NN][24],d[NN],max1[NN],maxk[NN],max2[NN],f[NN],val[NN],son[NN],siz[NN],tim,dfn[NN],idfn[NN],top[NN];
// vector<int>g[NN],p[NN];
// set<pair<int,int> >st[NN];
// void dfs1(int u,int fa)
// {
//     siz[u]=1;
//     up[u][0]=fa;
//     for(int i=1;i<=20;i++)
//         up[u][i]=up[up[u][i-1]][i-1];
//     d[u]=d[fa]+1;
//     p[d[u]].push_back(u);
//     for(auto v:g[u])
//     {
//         if(v==fa)
//             continue;
//         dfs1(v,u);
//         siz[u]+=siz[v];
//         if(siz[v]>siz[son[u]])
//             son[u]=v;
//     }
// }
// void dfs2(int u,int t)
// {
//     dfn[u]=++tim;
//     idfn[tim]=u;
//     top[u]=t;
//     if(son[u])
//         dfs2(son[u],t);
//     for(auto v:g[u])
//         if(v!=up[u][0]&&v!=son[u])
//             dfs2(v,v);
// }
// int upk(int u,int k)
// {
//     for(int i=0;i<=20;i++)
//         if(k>>i&1)
//             u=up[u][i];
//     return u;
// }
// void update(int u,int k,int w)
// {
//     if(w>max1[u])
//     {
//         if(k!=maxk[u])
//             max2[u]=max1[u];
//         max1[u]=w;
//         maxk[u]=k;
//     }
//     else if(k!=maxk[u])
//         max2[u]=max(max2[u],w);
// }
// struct segment_tree
// {
//     int l,r,val;
// }tr[NN<<2];
// void pushup(int u)
// {
//     int t=idfn[tr[u<<1].r];
//     tr[u].val=max(max(tr[u<<1].val,tr[u<<1|1].val),maxk[t]==idfn[tr[u<<1|1].l]?max2[t]:max1[t]);
// }
// void build(int u,int l,int r)
// {
//     tr[u]={l,r,0};
//     if(l==r)
//         return;
//     int mid=l+(r-l)/2;
//     build(u<<1,l,mid);
//     build(u<<1|1,mid+1,r);
//     pushup(u);
// }
// void modify(int u,int p)
// {
//     if(tr[u].l==tr[u].r)
//         return;
//     int mid=tr[u].l+(tr[u].r-tr[u].l)/2;
//     if(p<=mid)
//         modify(u<<1,p);
//     else
//         modify(u<<1|1,p);
//     pushup(u);
// }
// int query(int u,int l,int r)
// {
//     if(tr[u].l>=l&&tr[u].r<=r)
//         return tr[u].val;
//     int mid=tr[u].l+(tr[u].r-tr[u].l)/2;
//     if(r<=mid)
//         return query(u<<1,l,r);
//     if(l>mid)
//         return query(u<<1|1,l,r);
//     int t=idfn[mid];
//     return min(min(query(u<<1,l,r),query(u<<1|1,l,r)),maxk[t]==idfn[mid+1]?max2[t]:max1[t]);
// }
// int query_path(int u,int v)
// {
//     int ans=0;
//     while(top[u]!=top[v])
//     {
//         if(d[top[u]]<d[top[v]])
//             swap(u,v);
        
//     }
// }
int main()
{
    freopen("nim.in","r",stdin);
    freopen("nim.out","w",stdout);
    int n,s,a,b;
    scanf("%d%d%d%d",&n,&s,&a,&b);
    // build(1,1,n);
    if(b>=a)
    {
        printf("%d",1);
        return 0;
    }
    // dfs1(s,0);
    // dfs2(s,0);
    // for(int i=n;~i;i--)
    // {
    //     for(auto u:p[i])
    //     {
    //         if(!max1[u])
    //             max1[u]=;
    //         if(!max2[u])
    //             max2[u]=;
    //         for(auto v:g[u])
    //         {
    //             if(v==up[u][0])
    //                 continue;
    //             if(st[v].size()>st[u].size())
    //                 swap(st[v],st[u]);
    //             for(auto x:st[v])
    //                 st[u].insert(x);
    //             st[u].insert({max1[v],v});
    //         }
    //         while(st[u].size()&&d[st[u].begin()->second]>d[u]+b)
    //             st[u].erase(st[u].begin());
    //         if(!st[u].size())
    //             f[u]=1e9;
    //         else
    //             f[u]=st[u].begin()->first;
    //         f[u]=min(f[u],query_path(upk(u,b),u));
    //         update(upk(u,a),upk(u,a-1),f[u]);
    //         modify(1,dfn[upk(u,a)]);
    //     }
    // }
    // printf("%d",f1[1][0]);
    return 0;
}